﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dados;
using System.ComponentModel;
using Dados.DSMPTUDOTableAdapters;

namespace Negocios
{
    [DataObject]
    public class UsuarioBLL
    {

        [DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
        public Usuario Consulta(string id)
        {
            try
            {
                DSMPTUDO.T_USUARIODataTable usuarioDT = UsuarioDAL.ConsultaPorId(id);
                if (usuarioDT.Count == 1)
                    return (new Usuario(id, usuarioDT[0].tx_nome, usuarioDT[0].tx_email, usuarioDT[0].nr_tipo, usuarioDT[0].tx_senha));
                else return null;
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
        public Usuario ConsultaPorEmail(string email)
        {
            try
            {
                DSMPTUDO.T_USUARIODataTable usuarioDT = UsuarioDAL.ConsultaPorEmail(email);
                if (usuarioDT.Count == 1)
                    return (new Usuario(usuarioDT[0].tx_id, usuarioDT[0].tx_nome, usuarioDT[0].tx_email, usuarioDT[0].nr_tipo, usuarioDT[0].tx_senha));
                else return null;
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public static List<Usuario> ConsultaTodos()
        {
            try
            {
                List<Usuario> usuarios = new List<Usuario>();
                DSMPTUDO.T_USUARIODataTable usuarioDT = UsuarioDAL.ConsultaTodos();
                for (int i = 0; i < usuarioDT.Count; i++)
                {
                    Usuario a = new Usuario(usuarioDT[i].tx_id, usuarioDT[i].tx_nome, usuarioDT[i].tx_email, usuarioDT[i].nr_tipo, usuarioDT[i].tx_senha);
                    usuarios.Add(a);
                }
                return usuarios;

            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Insert, true)]
        public bool Insere(Usuario a)
        {
            try
            {
                if (Consulta(a.Id)!=null) 
                    throw new SystemException("Erro ao inserir, usuário existente!");

                return UsuarioDAL.Insere(a.Id, a.Nome, a.Email, a.Tipo, a.Senha);
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao inserir Usuario" + a.Nome);
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Update, true)]
        public bool Atualiza(Usuario a)
        {
            try
            {
                return UsuarioDAL.Atualiza(a.Id, a.Nome, a.Email, a.Tipo, a.Senha);
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao atualizar Usuario" + a.Nome);
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Delete, true)]
        public bool Remove(Usuario a)
        {
            try
            {
                return UsuarioDAL.Remove(a.Id);
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao remover Usuario" + a.Nome);
            }
        }
        
        public bool Autenticar(string id, string senha)
        {
            try
            {
                return UsuarioDAL.Autentica(id, senha);
            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao fazer login!");
            }
        }
        

        public string EsqueciSenha(int tipo, string campo)
        {
            
            try
            {
                if (tipo == 1)  //Identifica pelo id
                {
                    Usuario u = Consulta(campo);
                    if (u != null)
                        return ("Enviando nova senha para o usuário: " + u.Id + ", e-mail: " + u.Email);
                    else return ("Id não cadastrado.");
                }

                else if (tipo == 2)  //Identifica pelo email
                {
                    Usuario u = ConsultaPorEmail(campo);
                    if (u.Email != null)
                        return ("Enviando nova senha para o e-mail: " + u.Email + ", usuário: " + u.Id);
                    else return ("E-mail não cadastrado.");
                }
                
                else return "";

            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao enviar nova senha!");
            }
        }


        public List<Usuario> BuscarUsuarioPorVideo(string nome, int genero, int autor, int formato, int swf)
        {
            DSMPTUDO.T_USUARIODataTable resultado = UsuarioDAL.BuscaPorVideo(nome, genero, autor, formato, swf);
            
            try
            {
                List<Usuario> rBusca = new List<Usuario>();
                for (int i = 0; i < resultado.Count; i++)
                {
                    Usuario a = new Usuario(resultado[i].tx_id, resultado[i].tx_nome, resultado[i].tx_email, 
                        resultado[i].nr_tipo, resultado[i].tx_senha);
                    rBusca.Add(a);
                }
                return rBusca;

            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }

        public List<Usuario> BuscarUsuarioPorImagem(string nome, int autor, int formato, int swf)
        {
            DSMPTUDO.T_USUARIODataTable resultado = UsuarioDAL.BuscaPorImagem(nome, autor, formato, swf);
            try
            {
                List<Usuario> rBusca = new List<Usuario>();
                for (int i = 0; i < resultado.Count; i++)
                {
                    Usuario a = new Usuario(resultado[i].tx_id, resultado[i].tx_nome, resultado[i].tx_email, 
                        resultado[i].nr_tipo, resultado[i].tx_senha);
                    rBusca.Add(a);
                }
                return rBusca;

            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }

        public List<Usuario> BuscarUsuarioPorAudio(string nome, int genero, int autor, int formato, int swf)
        {
            DSMPTUDO.T_USUARIODataTable resultado = UsuarioDAL.BuscaPorAudio(nome, genero, autor, formato, swf);
            try
            {
                List<Usuario> rBusca = new List<Usuario>();
                for (int i = 0; i < resultado.Count; i++)
                {
                    Usuario a = new Usuario(resultado[i].tx_id, resultado[i].tx_nome, resultado[i].tx_email, 
                        resultado[i].nr_tipo, resultado[i].tx_senha);
                    rBusca.Add(a);
                }
                return rBusca;

            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao consultar Usuario");
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
        public List<Usuario> BuscarGeral(int tipo, string nome, int genero, int autor, int formato, int swf)
        {
            List<Usuario> user = new List<Usuario>();
            if (tipo == 1)
                user = BuscarUsuarioPorAudio(nome, genero, autor, formato, swf);
            else if (tipo == 2)
                user = BuscarUsuarioPorVideo(nome, genero, autor, formato, swf);
            else if (tipo == 3)
                user = BuscarUsuarioPorImagem(nome, autor, formato, swf);
            
                return user;

        }

        public bool AlterarSenhaUsuario(Usuario a, string senhaAtual, string novaSenha)
        {


            try
            {
                //guarda o retorno do metodo AlterarSenha
                bool retorno = UsuarioDAL.AlterarSenhaUsuario(a.Id, senhaAtual, novaSenha);

                if (!retorno)
                {
                    throw new SystemException("Erro ao alterar a senha do usuario" + a.Nome);
                }
                else return true;


            }
            catch (SystemException)
            {
                throw new SystemException("Erro ao alterar a senha do usuario" + a.Nome);
            }
        }
    }


    
}